package com.edu.exam.entity.grading.export;

import com.edu.exam.entity.core.AuditableEntity;
import com.edu.exam.enums.GradeExportType;
import com.edu.exam.enums.grading.ExportStatisticsPeriod;
import com.edu.exam.enums.grading.ExportStatisticsType;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.FieldDefaults;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * 成绩导出统计表实体类
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_export_statistics</p>
 *
 * <p>成绩导出统计管理表，用于记录和分析成绩导出的统计信息。
 * 支持多维度统计分析，包含使用统计、性能分析、质量分析、
     趋势分析等功能。</p>
 *
 * <p>主要功能特性：</p>
 * <ul>
 *   <li>导出使用统计分析（次数、频率、用户分布等）</li>
 *   <li>导出性能统计分析（时间、成功率、错误率等）</li>
 *   <li>导出质量统计分析（数据准确性、完整性等）</li>
 *   <li>导出趋势分析和预测</li>
 *   <li>用户行为分析和模式识别</li>
 *   <li>系统性能监控和优化建议</li>
 * </ul>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
public class GradeExportStatistics extends AuditableEntity {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    /**
     * 统计类型
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "statistics_type", nullable = false, length = 30)
    ExportStatisticsType statisticsType;

    /**
     * 统计周期
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "statistics_period", nullable = false, length = 20)
    ExportStatisticsPeriod statisticsPeriod;

    /**
     * 数据日期
     */
    @Column(name = "data_date", nullable = false)
    LocalDateTime dataDate;

    /**
     * 导出类型
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "export_type", length = 30)
    GradeExportType exportType;

    /**
     * 格式ID
     */
    @Column(name = "format_id")
    Long formatId;

    /**
     * 关联的格式对象
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "format_id", insertable = false, updatable = false)
    GradeExportFormat format;

    /**
     * 模板ID
     */
    @Column(name = "template_id")
    Long templateId;

    /**
     * 关联的模板对象
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "template_id", insertable = false, updatable = false)
    GradeExportTemplate template;

    /**
     * 用户ID
     */
    @Column(name = "user_id")
    Long userId;

    /**
     * 部门ID
     */
    @Column(name = "department_id")
    Long departmentId;

    /**
     * 统计标题
     */
    @Column(name = "statistics_title", nullable = false, length = 200)
    String statisticsTitle;

    /**
     * 统计描述
     */
    @Column(name = "statistics_description", length = 500)
    String statisticsDescription;

    /**
     * 总导出次数
     */
    @Column(name = "total_export_count")
    Long totalExportCount;

    /**
     * 成功导出次数
     */
    @Column(name = "success_export_count")
    Long successExportCount;

    /**
     * 失败导出次数
     */
    @Column(name = "failed_export_count")
    Long failedExportCount;

    /**
     * 成功率（百分比）
     */
    @Column(name = "success_rate", precision = 5, scale = 2)
    BigDecimal successRate;

    /**
     * 总处理时间（毫秒）
     */
    @Column(name = "total_processing_time_ms")
    Long totalProcessingTimeMs;

    /**
     * 平均处理时间（毫秒）
     */
    @Column(name = "avg_processing_time_ms")
    Long avgProcessingTimeMs;

    /**
     * 最小处理时间（毫秒）
     */
    @Column(name = "min_processing_time_ms")
    Long minProcessingTimeMs;

    /**
     * 最大处理时间（毫秒）
     */
    @Column(name = "max_processing_time_ms")
    Long maxProcessingTimeMs;

    /**
     * 总数据记录数
     */
    @Column(name = "total_data_records")
    Long totalDataRecords;

    /**
     * 平均数据记录数
     */
    @Column(name = "avg_data_records")
    Long avgDataRecords;

    /**
     * 总文件大小（字节）
     */
    @Column(name = "total_file_size_bytes")
    Long totalFileSizeBytes;

    /**
     * 平均文件大小（字节）
     */
    @Column(name = "avg_file_size_bytes")
    Long avgFileSizeBytes;

    /**
     * 峰值并发数
     */
    @Column(name = "peak_concurrent_count")
    Integer peakConcurrentCount;

    /**
     * 平均并发数
     */
    @Column(name = "avg_concurrent_count")
    Integer avgConcurrentCount;

    /**
     * 系统负载平均值
     */
    @Column(name = "avg_system_load", precision = 5, scale = 2)
    BigDecimal avgSystemLoad;

    /**
     * 内存使用峰值（MB）
     */
    @Column(name = "peak_memory_usage_mb")
    Long peakMemoryUsageMb;

    /**
     * CPU使用率平均值（百分比）
     */
    @Column(name = "avg_cpu_usage_percent", precision = 5, scale = 2)
    BigDecimal avgCpuUsagePercent;

    /**
     * 网络传输总量（字节）
     */
    @Column(name = "total_network_transfer_bytes")
    Long totalNetworkTransferBytes;

    /**
     * 缓存命中率（百分比）
     */
    @Column(name = "cache_hit_rate_percent", precision = 5, scale = 2)
    BigDecimal cacheHitRatePercent;

    /**
     * 数据库查询次数
     */
    @Column(name = "database_query_count")
    Long databaseQueryCount;

    /**
     * 平均查询响应时间（毫秒）
     */
    @Column(name = "avg_query_response_time_ms")
    Long avgQueryResponseTimeMs;

    /**
     * 错误类型分布
     */
    @Column(name = "error_type_distribution", columnDefinition = "TEXT")
    String errorTypeDistribution;

    /**
     * 用户活跃度统计
     */
    @Column(name = "user_activity_stats", columnDefinition = "TEXT")
    String userActivityStats;

    /**
     * 时间分布统计
     */
    @Column(name = "time_distribution_stats", columnDefinition = "TEXT")
    String timeDistributionStats;

    /**
     * 性能指标详情
     */
    @Column(name = "performance_metrics", columnDefinition = "TEXT")
    String performanceMetrics;

    /**
     * 质量评估分数
     */
    @Column(name = "quality_score", precision = 5, scale = 2)
    BigDecimal qualityScore;

    /**
     * 用户满意度评分
     */
    @Column(name = "user_satisfaction_score", precision = 5, scale = 2)
    BigDecimal userSatisfactionScore;

    /**
     * 系统稳定性评分
     */
    @Column(name = "system_stability_score", precision = 5, scale = 2)
    BigDecimal systemStabilityScore;

    /**
     * 趋势分析数据
     */
    @Column(name = "trend_analysis_data", columnDefinition = "TEXT")
    String trendAnalysisData;

    /**
     * 预测数据
     */
    @Column(name = "prediction_data", columnDefinition = "TEXT")
    String predictionData;

    /**
     * 异常事件记录
     */
    @Column(name = "anomaly_events", columnDefinition = "TEXT")
    String anomalyEvents;

    /**
     * 优化建议
     */
    @Column(name = "optimization_suggestions", columnDefinition = "TEXT")
    String optimizationSuggestions;

    /**
     * 风险评估结果
     */
    @Column(name = "risk_assessment", columnDefinition = "TEXT")
    String riskAssessment;

    /**
     * 统计数据版本
     */
    @Column(name = "statistics_version", length = 20)
    String statisticsVersion;

    /**
     * 数据来源
     */
    @Column(name = "data_source", length = 100)
    String dataSource;

    /**
     * 统计标签
     */
    @Column(name = "statistics_tags", length = 300)
    String statisticsTags;

    /**
     * 扩展属性
     */
    @Column(name = "extension_attributes", columnDefinition = "TEXT")
    String extensionAttributes;

    /**
     * 创建人ID
     */
    @Column(name = "creator_id")
    Long creatorId;

    /**
     * 更新人ID
     */
    @Column(name = "updater_id")
    Long updaterId;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "create_time", nullable = false, updatable = false)
    LocalDateTime createTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "update_time", nullable = false)
    LocalDateTime updateTime;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    Long version;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    Boolean isDeleted;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    LocalDateTime deleteTime;

    /**
     * 删除人ID
     */
    @Column(name = "deleter_id")
    Long deleterId;

    // ===== 业务逻辑方法 =====

    /**
     * 记录成功导出
     */
}
